/**
 * @project name:crm
 */
package com.yunbo.crm.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.yunbo.crm.base.BaseServiceImpl;
import com.yunbo.crm.dao.SaleChanceMapper;
import com.yunbo.crm.pojo.SaleChance;
import com.yunbo.crm.query.SaleChanceQuery;
import com.yunbo.crm.service.SaleChanceService;
import com.yunbo.crm.utils.AssertUtil;
import com.yunbo.crm.utils.CookieUtil;
import com.yunbo.crm.utils.PhoneUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author : yun&bo
 * @CreateDate : ==>2021/1/21 13:37
 * @ClassName : ==>
 * @Description : ==>
 * @Version
 */
@Service
public class SaleChanceServiceImpl extends BaseServiceImpl<SaleChance, Integer> implements SaleChanceService {
    @Resource
    private SaleChanceMapper saleChanceMapper;

    /**
     * layUI 数据表格要求的数据格式 键值对
     *
     * @param saleChanceQuery
     * @return
     */
    @Override
    public Map<String, Object> querySaleChanceByParams(SaleChanceQuery saleChanceQuery) {
        Map<String, Object> map = new HashMap<>();
        //开启分页
        PageHelper.startPage(saleChanceQuery.getPage(), saleChanceQuery.getLimit());
        //得到对应的营销机会列表
        List<SaleChance> saleChancesList = saleChanceMapper.selectByParams(saleChanceQuery);
        //得到分页对象
        PageInfo<SaleChance> pageInfo = new PageInfo<>(saleChancesList);
        map.put("code", 0);
        map.put("msg", "");
        map.put("count", pageInfo.getTotal());
        map.put("data", pageInfo.getList());
        return map;
    }

    /**
     * 添加营销机会数据
     * 1.参数校验 非空校验
     * 客户名
     * 联系人
     * 客户手机：格式检测
     * 2.设置参数默认值
     * flag   默认值1
     * 创建日期  当前
     * 创建人  当前登入用户
     * 如果设置了分配人
     * 状态 已分配
     * 开发状态   开发中
     * 分配时间   当前时间
     * 如果没设置
     * 状态 已分配
     * 开发状态   开发中
     * 分配时间   当前时间
     * 3.执行操作判断受影响的行数
     *
     * @param saleChance
     */
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    @Override
    public void addSaleChance(SaleChance saleChance, HttpServletRequest request) {
        /**
         * 参数校验
         */
        checkSaleChanceParams(saleChance.getCustomerName(), saleChance.getLinkMan(), saleChance.getLinkPhone());
        /**
         * 默认值填充
         */
        saleChance.setActiveFlag(1);
        saleChance.setCreateDate(new Date());
        saleChance.setUpdateDate(new Date());
        /**
         * 拿到当前用户
         */
        String userName = CookieUtil.getCookieValue(request, "userName");
        AssertUtil.isTrue(StringUtils.isBlank(userName), "请先登入登录");
        saleChance.setCreateBy(userName);
        /**
         * 判断是否设置
         */
        if (StringUtils.isBlank(saleChance.getAssignMan())) {
            /**
             * 未分配
             */
            saleChance.setAllocationStatus(0);
            saleChance.setDevResult(0);
            saleChance.setAssignTime(null);
        } else {
            /**
             * 已分配
             */
            saleChance.setAllocationStatus(1);
            saleChance.setDevResult(1);
            saleChance.setAssignTime(new Date());
        }
        AssertUtil.isTrue(saleChanceMapper.insertSelective(saleChance) < 1, "营销机会添加失败");
    }

    /**
     * 更新营销机会
     * 1.校验数据
     * 客户名
     * 联系人
     * 客户手机：格式检测
     * 营销机会ID
     * 2.给默认值
     * 1.修改前 未设置分配人
     * 修改后未设置   不做修改
     * 修改后已设置
     * 分配状态        1已分配0未分配
     * 开发状态        1开发中0未开发
     * assigntime      分配时间设置为当前时间
     *
     * @param saleChance
     * @param request
     */
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    @Override
    public void updateSaleChance(SaleChance saleChance, HttpServletRequest request) {
        /**
         * 判断营销机会ID是否存在
         */
        AssertUtil.isTrue(saleChance.getRowId() == null, "营销机会更新异常");
        /**
         * 判断必填字段是否为空
         */
        checkSaleChanceParams(saleChance.getCustomerName(), saleChance.getLinkMan(), saleChance.getLinkPhone());
        /**
         * 通过ID拿到营销机会对象
         */
        SaleChance temp = saleChanceMapper.selectByPrimaryKey(saleChance.getRowId());
        /**
         * 设置默认值
         */
        saleChance.setUpdateDate(new Date());
        /**
         * 设置更新人
         */
        saleChance.setUpdateBy(getLoginUserName(request));
        /**
         * 设置更新时间
         */
        saleChance.setUpdateDate(new Date());
        /**
         * 修改数据有效性
         */
        saleChance.setActiveFlag(1);
        /**
         * 修改分配人状态
         * thinking
         * 拿到库数据 前端数据
         * 前端
         * 如果没有指派人
         *      指派时间null，指派状态0，开发状态0
         * 如果有指派人
         *      如果和库名字相同
         *          得到指派时间
         *      如果和原名字不相同
         *          指派状态设置为1 ， 开发状态设置为1，指派时间设置为新
         */
        if (!StringUtils.isBlank(saleChance.getAssignMan()) && saleChance.getAssignMan() != temp.getAssignMan()) {
            //如果指派人换了的情况下
            //设置指派状态
            saleChance.setAllocationStatus(1);
            //设置开发状态
            saleChance.setDevResult(1);
            //设置指派时间
            saleChance.setAssignTime(new Date());
        } else if (StringUtils.isBlank(saleChance.getAssignMan())) {
            //没有指派人的情况下
            saleChance.setAllocationStatus(0);
            saleChance.setDevResult(0);
            saleChance.setAssignTime(null);
        } else {
            //指派人没变的情况下
            saleChance.setAssignTime(temp.getAssignTime());
        }
        saleChanceMapper.updateByPrimaryKey(saleChance);
    }


    @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void deleteSaleChances(Integer[] ids) {
        AssertUtil.isTrue(null == ids || ids.length < 1, "待删除不存在");
        AssertUtil.isTrue(saleChanceMapper.deleteBatch(ids) != ids.length, "营销机会删除失败");
    }

    @Override
    public void updateSaleChanceDevResult(Integer rowId, Integer devResult) {
        AssertUtil.isTrue(null == rowId, "待更新记录不存在!");
        SaleChance temp = selectByPrimaryKey(rowId);
        AssertUtil.isTrue(null == temp, "待更新记录不存在!");
        temp.setDevResult(devResult);
        AssertUtil.isTrue(updateByPrimaryKeySelective(temp) < 1, "机会数据更新失败!");

    }


    private void checkSaleChanceParams(String customerName, String linkMan, String linkPhone) {
        AssertUtil.isTrue(StringUtils.isBlank(customerName), "营销机会添加失败");
        AssertUtil.isTrue(StringUtils.isBlank(linkMan), "联系人不能为空");
        AssertUtil.isTrue(StringUtils.isBlank(linkPhone), "联系号码不能为空");
        AssertUtil.isTrue(!PhoneUtil.isMobile(linkPhone), "联系号码格式不正确");
    }


}
